
<!DOCTYPE html>
<html>
<title>Sankey Diagram</title>
<style>
    @import url(../style.css?aea6f0a);

    #chart {
        height: 500px;
    }

    .node rect {
        cursor: move;
        fill-opacity: .9;
        shape-rendering: crispEdges;
    }

    .node text {
        pointer-events: none;
        text-shadow: 0 1px 0 #fff;
    }

    .link {
        fill: none;
        stroke: #000;
        stroke-opacity: .2;
    }

        .link:hover {
            stroke-opacity: .5;
        }
</style>
<body>

    <a href="../index.html">cola.js home</a>
    <h1>Sankey Diagram</h1>

    <p id="chart">

        <aside>Drag to rearrange nodes.</aside>
        <script src="http://d3js.org/d3.v2.min.js?2.9.1"></script>
        <script src="../extern/sankey.js"></script>
        <script>

            var margin = { top: 1, right: 1, bottom: 6, left: 1 },
                width = 960 - margin.left - margin.right,
                height = 500 - margin.top - margin.bottom;

            var formatNumber = d3.format(",.0f"),
                format = function (d) { return formatNumber(d) + " people"; },
                color = d3.scale.category20();

            var svg = d3.select("#chart").append("svg")
                .attr("width", width + margin.left + margin.right)
                .attr("height", height + margin.top + margin.bottom)
              .append("g")
                .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

            var sankey = d3.sankey()
                .nodeWidth(15)
                .nodePadding(10)
                .size([width, height]);

            var path = sankey.link();

            d3.json("graphdata/dynamic.json", function (graph) {
                sankey
                    .nodes(graph.nodes)
                    .links(graph.links)
                    .layout(32);

                var link = svg.append("g").selectAll(".link")
                    .data(graph.links)
                  .enter().append("path")
                    .attr("class", "link")
                    .attr("d", path)
                    .style("stroke-width", function (d) { return Math.max(1, d.dy); })
                    .attr("visibility", function (d) { return d.dy > 1 ? "visible" : "hidden" })
                    .sort(function (a, b) { return b.dy - a.dy; });

                link.append("title")
                    .text(function (d) { return d.source.name + " → " + d.target.name + "\n" + format(d.value); });

                var node = svg.append("g").selectAll(".node")
                    .data(graph.nodes)
                  .enter().append("g")
                    .attr("class", "node")
                    .attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; })
                  .call(d3.behavior.drag()
                    .origin(function (d) { return d; })
                    .on("dragstart", function () { this.parentNode.appendChild(this); })
                    .on("drag", dragmove));

                node.append("rect")
                    .attr("height", function (d) { return d.dy; })
                    .attr("width", sankey.nodeWidth())
                    .attr("visibility", function (d) { return d.dy > 1 ? "visible" : "hidden"})
                    .style("fill", function (d) { return d.color = color(d.name.replace(/....$/, "")); })
                    .style("stroke", function (d) { return d3.rgb(d.color).darker(2); })
                  .append("title")
                    .text(function (d) { return d.name + "\n" + format(d.value); });

                node.append("text")
                    .attr("x", -6)
                    .attr("y", function (d) { return d.dy / 2; })
                    .attr("visibility", function (d) { return d.dy > 1 ? "visible" : "hidden" })
                    .attr("dy", ".35em")
                    .attr("text-anchor", "end")
                    .attr("transform", null)
                    .text(function (d) { return d.name; })
                  .filter(function (d) { return d.x < width / 2; })
                    .attr("x", 6 + sankey.nodeWidth())
                    .attr("text-anchor", "start");

                function dragmove(d) {
                    d3.select(this).attr("transform", "translate(" + d.x + "," + (d.y = Math.max(0, Math.min(height - d.dy, d3.event.y))) + ")");
                    sankey.relayout();
                    link.attr("d", path);
                }
            });

        </script>

        Based on <a href="http://bost.ocks.org/mike/sankey/">code</a> by Mike Bostock
        <script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-63535113-1', 'auto');
  ga('send', 'pageview');

        </script>
</body>
</html>
